class Animal {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
  protected  move(distanceInMeters: number = 0) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}
class Snake extends Animal {
    constructor(name: string) {
        super(name);
    }
    jump(num:number) { //子类中可以定义自己的方法，不需要使用protected关键字，但是必须使用super关键字，否则会报错
        console.log("Jumping...");
        super.move(num); //调用父类的方法，必须使用super关键字，否则会报错
    }
}
let sam = new Snake("Sammy the Python");
sam.jump(10); //Jumping...
// sam.move(); //报错，因为move方法是protected，只能在子类中调用
class Dog extends Animal {
    constructor(name: string) {
        super(name);
    }
    jump(num:number) { //子类中可以定义自己的方法，不需要使用protected关键字，但是必须使用super关键字，否则会报错
        console.log("Jumping...");
        super.move(num); //调用父类的方法，必须使用super关键字，否则会报错
        this.slimp(); //调用子类的方法，不需要使用super关键字，但是必须在子类中定义，否则会报错
    }
    private slimp(){
        console.log("Slimping...");
    }
}
class Horse extends Dog {}
let horse = new Horse("Tommy the Palomino");
horse.jump(10); //Jumping...
// horse.slimp(); //报错，因为slimp方法是private，只能在子类中调用